'''
@Author: cjyx9
@Date: 2020-03-26 12:57:11
@LastEditTime: 2020-03-28 14:57:36
@Description: 教材爬虫模块
@FilePath: \爬取人教教材\tool.py
'''
# -*- coding: utf-8 -*-

import os
import sys
import requests
from PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import portrait
from Image2PDF import convert_images2PDF_one_dir

headers = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
}
# 定义获取头

desktop = os.path.join(os.path.expanduser("~"), 'Desktop')
# 获取桌面路径
# print(desktop)
# 默认下载到 桌面/book/ 文件"夹内", 可以根据需要自己改路径

nameDict = {
    "语文": "yw",
    "数学": "sx",
    "英语": "yy",
    "政治": "df",
    "道德与法治": "df",
    "中国历史": "zgls",
    "世界历史": "sjls",
    "地理": "dl",
    "生物": "sw",
    "化学": "hx",
    "物理": "wl"
}
# 本项目目前使用七年级下册的课本做示范
# 这里是对应课本在人教版网站上的代码,可以在 https://bp.pep.com.cn/jc/ 获取

gradeDict = {
    "七年级": "qinjxc",
    "7": "qinjxc",
    "7年级": "qinjxc",
    "八年级": "banjxc",
    "8": "banjxc",
    "8年级": "banjxc",
    "九年级": "jiunjxc",
    "9": "jiunjxc",
    "9年级": "jiunjxc"
}
# 年级后缀
#! 历史书7、8年级是中国历史(zgls),9年级是世界历史(sjls),要加一个判断


def downloadImage(imgUrl, fileName):
    r"""下载图片
    :imgUrl: 图片链接
    :fileName: 图片将要下载到的路径
    """
    r = requests.get(imgUrl, headers=headers, stream=True)
    # print(r.status_code)
    # 返回状态码
    if r.status_code == 200:
        # 若状态码为200(获取成功)
        open(fileName, 'wb').write(r.content)  # 将内容写入图片
        print("Done:", imgUrl)  # 可注释
    else:
        print("错误的链接或网络:", imgUrl, "!")
    del r
    # 从内存中删除临时变量r

def getPage(url):
    # // TODO 自动获取总页数
    # // TODO Url: https://bp.pep.com.cn/ebook/{subjectCode}/mobile/javascript/config.js
    # // TODO Idea: 定义了描述总页数的全局变量 "bookConfig.totalPageCount"
    r"""自动获取总页数
    :url: config链接
    """
    # url = "https://bp.pep.com.cn/ebook/sjlsjiunjxc/mobile/javascript/config.js" # 链接
    config = requests.get(url)
    config.encoding = 'utf-8'
    front = 'bookConfig.totalPageCount='  # 前缀
    after = ';bookConfig.largePageWidth='  # 后缀
    # 注意,这儿不能直接用 ; 做截取后缀,因为 ; 在config.js里不止一个,而Python只会截取字符串里的第一个子字符串
    pageCount = int(config.text[config.text.index(
        front)+len(front):config.text.index(after)])  # 截取页面总数
    #! 这里直接从config.js截取了totalPageCount变量,如果你有更好的方法,欢迎PR
    return pageCount


def spyder(pageCount, subject, grade):
    r"""爬取教材主函数
    :pageCount: 要爬取的页数
    :subject: 学科名
    :grade: 年级
    """

    # start exists()方法:判断文件夹是否"存在", 不存在则创建

    if not(os.path.exists(desktop + "\\books\\")):
        os.mkdir(desktop + "\\books\\")

    if not(os.path.exists(desktop + "\\books\\" + grade + "下_" + subject + "\\")):
        os.mkdir(desktop + "\\books\\" + grade + "下_" + subject + "\\")

    # end 判断文件夹是否"存在", 不存在则创建

    if pageCount == "":
        # 获取总页数
        pageCount = getPage("https://bp.pep.com.cn/ebook/" + nameDict[subject] + gradeDict[grade] + "/mobile/javascript/config.js")
    	# 拼接config.js的链接,传入getPage函数

    for count in range(pageCount):
        # 循环下载图片
        imgUrl = "https://bp.pep.com.cn/ebook/" + nameDict[subject] + gradeDict[grade] + "/files/mobile/" + str(count+1) + ".jpg"
        #! 拼接下载链接 示例: https://bp.pep.com.cn/ebook/ywqinjxc/files/mobile/1.jpg
        fileName = desktop + "\\books\\" + grade + "下_" + subject + "\\Page_" + str(count+1) + ".jpg"
        #! 拼接下载路径 示例: {desktop}\book\7下_语文
        downloadImage(imgUrl, fileName)
        mainFile = desktop + "\\books\\" + grade + "下_" + subject + "\\"
    print('Great!已将教材下载到了', mainFile, "快去看看吧!")
    # 完成后的提示
    if input("图片已经下载完毕,你要将他们转换为PDF吗(y&n)")=="y":
        convert_images2PDF_one_dir(mainFile, save_name = "All_"+subject+"_教材.pdf")
    #// TODO 图片转pdf
    #// TODO IdeaUrl: https://github.com/liuqi0725/image2PDF/blob/master/Image2PDF.py


def printHelp():
    print("*"*50)
    print("""
    爬虫说明:
    此程序只爬取人教版7、8、9年级的语文, 数学, 英语, 政治(道德与法治), 中国历史, 世界历史, 地理, 生物, 化学, 物理教材
    如需爬取其他教材,可根据 https://bp.pep.com.cn/jc/ 来修改代码
    由本爬虫爬取的内容仅供学习,不得用于其他用途！最终版权归人民教育出版社所有。
    帮助:
    0.打开并运行程序
    1.输入你的年级,有三种格式(示例：“7年级”,“7”或“七年级”)
    2.输入你要爬取教材的学科(语文, 数学, 英语, 政治(道德与法治), 中国历史(7,8年级), 世界历史(9年级), 地理(7,8年级), 生物(7,8年级), 化学(9年级), 物理(8,9年级))
    """)
    print("*"*50)

def inputMessage():
    r"""交互模块
    """
    # // TODO 获取年级

    while True:
        grade = input("输入你的年级(格式：“7年级”,“7”或“七年级”):")
        if grade in ["7", "8", "9", "7年级", "8年级", "9年级", "七年级", "八年级", "九年级"]:
            break
            # 跳出循环
        else:
            # 对用户输入的判断最傻的方法
            print("无此命令!")
            
    while True:
        subject = input("输入你要爬取教材的学科:")
        if subject in ["语文", "数学", "英语", "政治", "道德与法治", "历史", "地理", "生物", "化学", "物理"]:
            if subject == "历史" and not(grade in ["9","九年级", "9年级"]):
                subject = "中国历史"
            elif subject == "历史" and grade in ["9","九年级", "9年级"]:
                subject = "世界历史"
            # 对历史教材的处理
            # print(subject)
            break
        else:
            # 对用户输入的判断最傻的方法
            print("无此命令!")
        
    while True:
        page = input("输入你要爬取至哪一页(不填则下载全部):").strip()
        if page == "":
            break
        elif page.isdecimal():
            page = int(page)
            break
        else:
            print("输入有误!")
            
    spyder(page, subject, grade)
    # 调用函数下载